package com.ly.base.chapter03;

import java.util.Comparator;
import java.util.Optional;
import java.util.OptionalDouble;
import java.util.stream.Stream;

/**
 * 化简
 */
public class AJReduceDemo {
    //数据类
    record Hero(String name, int strength) { }

    /**
    化简：两两合并，只剩一个
    适合：最大值、最小值、求和、求个数...
        .reduce((p, x) -> r)        p 上次的合并结果， x 当前元素， r 本次合并结果
        .reduce(init, (p, x) -> r)
        .reduce(init, (p, x) -> r, (r1, r2) -> r)
 */
    public static void main(String[] args) {
        Stream<Hero> stream = Stream.of(
                new Hero("令狐冲", 90),
                new Hero("风清扬", 98),
                new Hero("独孤求败", 100),
                new Hero("方证", 92),
                new Hero("东方不败", 98),
                new Hero("冲虚", 90),
                new Hero("向问天", 88),
                new Hero("任我行", 92),
                new Hero("不戒", 88)
        );

        //1.1、获取最高武力值对象
//        Optional<Hero> result = stream.reduce((h1, h2) -> h1.strength() > h2.strength() ? h1 : h2); //Optional[Hero[name=独孤求败, strength=100]]

        //1.2、二参（垫底对象，比较逻辑）
//        Hero result = stream.reduce(new Hero("-", -1), (h1, h2) -> h1.strength() > h2.strength() ? h1 : h2); //Hero[name=独孤求败, strength=100]

        //2.1 求高手总数
//        Integer result = stream.map(h -> 1).reduce(0, (a, b) -> a + b); // 9
//        long result = stream.count(); //API： count()求和
//        Optional<Hero> result = stream.max(Comparator.comparing(Hero::strength)); // max(比较器) 获取武力最 大 值
//        Optional<Hero> result = stream.min(Comparator.comparing(Hero::strength)); // min(比较器) 获取武力最 小 值
//        int result =  stream.mapToInt(Hero::strength).sum(); // 武力值求和：sum()
        OptionalDouble result = stream.mapToInt(Hero::strength).average(); // 武力平均值：average()

        System.out.println(result);
    }
}
